/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package iTrace.impl;

import iTrace.AbstractionLevel;
import iTrace.AnotationLink;
import iTrace.Artefact;
import iTrace.Aspect;
import iTrace.Block;
import iTrace.Code;
import iTrace.ITraceFactory;
import iTrace.ITracePackage;
import iTrace.LinkMode;
import iTrace.M2MLink;
import iTrace.M2TLink;
import iTrace.Model;
import iTrace.ModelElement;
import iTrace.TechnicalBinding;
import iTrace.TraceLink;
import iTrace.TransformationLink;
import iTrace.iTraceModel;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;

import org.eclipse.emf.ecore.impl.EPackageImpl;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class ITracePackageImpl extends EPackageImpl implements ITracePackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass iTraceModelEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass traceLinkEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass modelElementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass m2MLinkEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass m2TLinkEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass artefactEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass codeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass blockEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass transformationLinkEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass anotationLinkEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass modelEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum linkModeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum technicalBindingEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum abstractionLevelEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum aspectEEnum = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see iTrace.ITracePackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private ITracePackageImpl() {
		super(eNS_URI, ITraceFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 * 
	 * <p>This method is used to initialize {@link ITracePackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static ITracePackage init() {
		if (isInited) return (ITracePackage)EPackage.Registry.INSTANCE.getEPackage(ITracePackage.eNS_URI);

		// Obtain or create and register package
		ITracePackageImpl theITracePackage = (ITracePackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ITracePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ITracePackageImpl());

		isInited = true;

		// Create package meta-data objects
		theITracePackage.createPackageContents();

		// Initialize created meta-data
		theITracePackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theITracePackage.freeze();

  
		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(ITracePackage.eNS_URI, theITracePackage);
		return theITracePackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getiTraceModel() {
		return iTraceModelEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getiTraceModel_ITraceModelTraceLink() {
		return (EReference)iTraceModelEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getiTraceModel_ITraceModelArtefact() {
		return (EReference)iTraceModelEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getiTraceModel_Name() {
		return (EAttribute)iTraceModelEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getiTraceModel_Version() {
		return (EAttribute)iTraceModelEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getTraceLink() {
		return traceLinkEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTraceLink_CreatedOn() {
		return (EAttribute)traceLinkEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTraceLink_TraceLinkSource() {
		return (EReference)traceLinkEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTraceLink_Mode() {
		return (EAttribute)traceLinkEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTraceLink_Comment() {
		return (EAttribute)traceLinkEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTraceLink_TechnicalBinding() {
		return (EAttribute)traceLinkEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTraceLink_TraceLinkITraceModel() {
		return (EReference)traceLinkEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getModelElement() {
		return modelElementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getModelElement_Ref() {
		return (EReference)modelElementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getModelElement_ModelElementModel() {
		return (EReference)modelElementEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getModelElement_SourceTraceLink() {
		return (EReference)modelElementEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getModelElement_TargetM2MLink() {
		return (EReference)modelElementEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getModelElement_TargetAnotationLink() {
		return (EReference)modelElementEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getM2MLink() {
		return m2MLinkEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getM2MLink_M2MLinkTarget() {
		return (EReference)m2MLinkEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getM2TLink() {
		return m2TLinkEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getM2TLink_M2TLinkCode() {
		return (EReference)m2TLinkEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getArtefact() {
		return artefactEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getArtefact_Aspect() {
		return (EAttribute)artefactEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getArtefact_ArtefactITraceModel() {
		return (EReference)artefactEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getCode() {
		return codeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getCode_CodeBlock() {
		return (EReference)codeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getCode_CodeM2TLink() {
		return (EReference)codeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getBlock() {
		return blockEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getBlock_FileName() {
		return (EAttribute)blockEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getBlock_StartLine() {
		return (EAttribute)blockEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getBlock_EndLine() {
		return (EAttribute)blockEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getBlock_StartRow() {
		return (EAttribute)blockEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getBlock_EndRow() {
		return (EAttribute)blockEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getBlock_BlockCode() {
		return (EReference)blockEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getTransformationLink() {
		return transformationLinkEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTransformationLink_RuleName() {
		return (EAttribute)transformationLinkEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getAnotationLink() {
		return anotationLinkEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getAnotationLink_CreatedBy() {
		return (EAttribute)anotationLinkEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getAnotationLink_AnotationLinkTarget() {
		return (EReference)anotationLinkEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getModel() {
		return modelEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getModel_ModelModelElement() {
		return (EReference)modelEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getModel_Name() {
		return (EAttribute)modelEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getModel_AbstractionLevel() {
		return (EAttribute)modelEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getModel_Metamodel() {
		return (EAttribute)modelEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getLinkMode() {
		return linkModeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getTechnicalBinding() {
		return technicalBindingEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getAbstractionLevel() {
		return abstractionLevelEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getAspect() {
		return aspectEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ITraceFactory getITraceFactory() {
		return (ITraceFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		iTraceModelEClass = createEClass(ITRACE_MODEL);
		createEReference(iTraceModelEClass, ITRACE_MODEL__ITRACE_MODEL_TRACE_LINK);
		createEReference(iTraceModelEClass, ITRACE_MODEL__ITRACE_MODEL_ARTEFACT);
		createEAttribute(iTraceModelEClass, ITRACE_MODEL__NAME);
		createEAttribute(iTraceModelEClass, ITRACE_MODEL__VERSION);

		traceLinkEClass = createEClass(TRACE_LINK);
		createEAttribute(traceLinkEClass, TRACE_LINK__CREATED_ON);
		createEReference(traceLinkEClass, TRACE_LINK__TRACE_LINK_SOURCE);
		createEAttribute(traceLinkEClass, TRACE_LINK__MODE);
		createEAttribute(traceLinkEClass, TRACE_LINK__COMMENT);
		createEAttribute(traceLinkEClass, TRACE_LINK__TECHNICAL_BINDING);
		createEReference(traceLinkEClass, TRACE_LINK__TRACE_LINK_ITRACE_MODEL);

		modelElementEClass = createEClass(MODEL_ELEMENT);
		createEReference(modelElementEClass, MODEL_ELEMENT__REF);
		createEReference(modelElementEClass, MODEL_ELEMENT__MODEL_ELEMENT_MODEL);
		createEReference(modelElementEClass, MODEL_ELEMENT__SOURCE_TRACE_LINK);
		createEReference(modelElementEClass, MODEL_ELEMENT__TARGET_M2M_LINK);
		createEReference(modelElementEClass, MODEL_ELEMENT__TARGET_ANOTATION_LINK);

		m2MLinkEClass = createEClass(M2M_LINK);
		createEReference(m2MLinkEClass, M2M_LINK__M2M_LINK_TARGET);

		m2TLinkEClass = createEClass(M2T_LINK);
		createEReference(m2TLinkEClass, M2T_LINK__M2T_LINK_CODE);

		artefactEClass = createEClass(ARTEFACT);
		createEAttribute(artefactEClass, ARTEFACT__ASPECT);
		createEReference(artefactEClass, ARTEFACT__ARTEFACT_ITRACE_MODEL);

		codeEClass = createEClass(CODE);
		createEReference(codeEClass, CODE__CODE_BLOCK);
		createEReference(codeEClass, CODE__CODE_M2T_LINK);

		blockEClass = createEClass(BLOCK);
		createEAttribute(blockEClass, BLOCK__FILE_NAME);
		createEAttribute(blockEClass, BLOCK__START_LINE);
		createEAttribute(blockEClass, BLOCK__END_LINE);
		createEAttribute(blockEClass, BLOCK__START_ROW);
		createEAttribute(blockEClass, BLOCK__END_ROW);
		createEReference(blockEClass, BLOCK__BLOCK_CODE);

		transformationLinkEClass = createEClass(TRANSFORMATION_LINK);
		createEAttribute(transformationLinkEClass, TRANSFORMATION_LINK__RULE_NAME);

		anotationLinkEClass = createEClass(ANOTATION_LINK);
		createEAttribute(anotationLinkEClass, ANOTATION_LINK__CREATED_BY);
		createEReference(anotationLinkEClass, ANOTATION_LINK__ANOTATION_LINK_TARGET);

		modelEClass = createEClass(MODEL);
		createEReference(modelEClass, MODEL__MODEL_MODEL_ELEMENT);
		createEAttribute(modelEClass, MODEL__NAME);
		createEAttribute(modelEClass, MODEL__ABSTRACTION_LEVEL);
		createEAttribute(modelEClass, MODEL__METAMODEL);

		// Create enums
		linkModeEEnum = createEEnum(LINK_MODE);
		technicalBindingEEnum = createEEnum(TECHNICAL_BINDING);
		abstractionLevelEEnum = createEEnum(ABSTRACTION_LEVEL);
		aspectEEnum = createEEnum(ASPECT);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		m2MLinkEClass.getESuperTypes().add(this.getTransformationLink());
		m2TLinkEClass.getESuperTypes().add(this.getTransformationLink());
		codeEClass.getESuperTypes().add(this.getArtefact());
		transformationLinkEClass.getESuperTypes().add(this.getTraceLink());
		anotationLinkEClass.getESuperTypes().add(this.getTraceLink());
		modelEClass.getESuperTypes().add(this.getArtefact());

		// Initialize classes and features; add operations and parameters
		initEClass(iTraceModelEClass, iTraceModel.class, "iTraceModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getiTraceModel_ITraceModelTraceLink(), this.getTraceLink(), this.getTraceLink_TraceLinkITraceModel(), "iTraceModelTraceLink", null, 0, -1, iTraceModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getiTraceModel_ITraceModelArtefact(), this.getArtefact(), this.getArtefact_ArtefactITraceModel(), "iTraceModelArtefact", null, 0, -1, iTraceModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getiTraceModel_Name(), ecorePackage.getEString(), "name", null, 1, 1, iTraceModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getiTraceModel_Version(), ecorePackage.getEInt(), "version", null, 0, 1, iTraceModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(traceLinkEClass, TraceLink.class, "TraceLink", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getTraceLink_CreatedOn(), ecorePackage.getEString(), "createdOn", "2011-09-01", 1, 1, TraceLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTraceLink_TraceLinkSource(), this.getModelElement(), this.getModelElement_SourceTraceLink(), "traceLinkSource", null, 1, -1, TraceLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getTraceLink_Mode(), this.getLinkMode(), "mode", null, 1, 1, TraceLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getTraceLink_Comment(), ecorePackage.getEString(), "comment", null, 0, 1, TraceLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getTraceLink_TechnicalBinding(), this.getTechnicalBinding(), "technicalBinding", null, 1, 1, TraceLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTraceLink_TraceLinkITraceModel(), this.getiTraceModel(), this.getiTraceModel_ITraceModelTraceLink(), "traceLinkITraceModel", null, 1, 1, TraceLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(modelElementEClass, ModelElement.class, "ModelElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getModelElement_Ref(), ecorePackage.getEObject(), null, "ref", null, 1, 1, ModelElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getModelElement_ModelElementModel(), this.getModel(), this.getModel_ModelModelElement(), "modelElementModel", null, 1, 1, ModelElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getModelElement_SourceTraceLink(), this.getTraceLink(), this.getTraceLink_TraceLinkSource(), "sourceTraceLink", null, 1, 1, ModelElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getModelElement_TargetM2MLink(), this.getM2MLink(), this.getM2MLink_M2MLinkTarget(), "targetM2MLink", null, 1, 1, ModelElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getModelElement_TargetAnotationLink(), this.getAnotationLink(), this.getAnotationLink_AnotationLinkTarget(), "targetAnotationLink", null, 1, 1, ModelElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(m2MLinkEClass, M2MLink.class, "M2MLink", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getM2MLink_M2MLinkTarget(), this.getModelElement(), this.getModelElement_TargetM2MLink(), "M2MLinkTarget", null, 1, -1, M2MLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(m2TLinkEClass, M2TLink.class, "M2TLink", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getM2TLink_M2TLinkCode(), this.getCode(), this.getCode_CodeM2TLink(), "M2TLinkCode", null, 1, -1, M2TLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(artefactEClass, Artefact.class, "Artefact", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getArtefact_Aspect(), this.getAspect(), "aspect", null, 1, 1, Artefact.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getArtefact_ArtefactITraceModel(), this.getiTraceModel(), this.getiTraceModel_ITraceModelArtefact(), "artefactITraceModel", null, 1, 1, Artefact.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(codeEClass, Code.class, "Code", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getCode_CodeBlock(), this.getBlock(), this.getBlock_BlockCode(), "codeBlock", null, 1, -1, Code.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getCode_CodeM2TLink(), this.getM2TLink(), this.getM2TLink_M2TLinkCode(), "codeM2TLink", null, 1, 1, Code.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(blockEClass, Block.class, "Block", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getBlock_FileName(), ecorePackage.getEString(), "fileName", null, 1, 1, Block.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getBlock_StartLine(), ecorePackage.getEInt(), "startLine", null, 1, 1, Block.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getBlock_EndLine(), ecorePackage.getEInt(), "endLine", null, 1, 1, Block.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getBlock_StartRow(), ecorePackage.getEInt(), "startRow", null, 1, 1, Block.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getBlock_EndRow(), ecorePackage.getEInt(), "endRow", null, 1, 1, Block.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getBlock_BlockCode(), this.getCode(), this.getCode_CodeBlock(), "blockCode", null, 1, 1, Block.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(transformationLinkEClass, TransformationLink.class, "TransformationLink", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getTransformationLink_RuleName(), ecorePackage.getEString(), "ruleName", null, 1, 1, TransformationLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(anotationLinkEClass, AnotationLink.class, "AnotationLink", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getAnotationLink_CreatedBy(), ecorePackage.getEString(), "createdBy", null, 1, 1, AnotationLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getAnotationLink_AnotationLinkTarget(), this.getModelElement(), this.getModelElement_TargetAnotationLink(), "anotationLinkTarget", null, 1, -1, AnotationLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(modelEClass, Model.class, "Model", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getModel_ModelModelElement(), this.getModelElement(), this.getModelElement_ModelElementModel(), "modelModelElement", null, 1, -1, Model.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getModel_Name(), ecorePackage.getEString(), "name", null, 1, 1, Model.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getModel_AbstractionLevel(), this.getAbstractionLevel(), "abstractionLevel", null, 0, 1, Model.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getModel_Metamodel(), ecorePackage.getEBoolean(), "metamodel", null, 1, 1, Model.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(linkModeEEnum, LinkMode.class, "LinkMode");
		addEEnumLiteral(linkModeEEnum, LinkMode.MANUAL);
		addEEnumLiteral(linkModeEEnum, LinkMode.AUTOMATIC);

		initEEnum(technicalBindingEEnum, TechnicalBinding.class, "TechnicalBinding");
		addEEnumLiteral(technicalBindingEEnum, TechnicalBinding.ATL);
		addEEnumLiteral(technicalBindingEEnum, TechnicalBinding.AMW);
		addEEnumLiteral(technicalBindingEEnum, TechnicalBinding.MOF_SCRIPT);
		addEEnumLiteral(technicalBindingEEnum, TechnicalBinding.OTHER);

		initEEnum(abstractionLevelEEnum, AbstractionLevel.class, "AbstractionLevel");
		addEEnumLiteral(abstractionLevelEEnum, AbstractionLevel.CIM);
		addEEnumLiteral(abstractionLevelEEnum, AbstractionLevel.PIM);
		addEEnumLiteral(abstractionLevelEEnum, AbstractionLevel.PSM);
		addEEnumLiteral(abstractionLevelEEnum, AbstractionLevel.PDM);
		addEEnumLiteral(abstractionLevelEEnum, AbstractionLevel.ANNOTATION);

		initEEnum(aspectEEnum, Aspect.class, "Aspect");
		addEEnumLiteral(aspectEEnum, Aspect.INTERFACE);
		addEEnumLiteral(aspectEEnum, Aspect.CONTENT);
		addEEnumLiteral(aspectEEnum, Aspect.BEHAVIOUR);
		addEEnumLiteral(aspectEEnum, Aspect.QUALITY);
		addEEnumLiteral(aspectEEnum, Aspect.SEMANTICS);
		addEEnumLiteral(aspectEEnum, Aspect.ARCHITECTURE);

		// Create resource
		createResource(eNS_URI);
	}

} //ITracePackageImpl
